第4章 静的なWebサイトの構築
静的コンテンツの公開
設定例
code:http.conf
http {
include mime.types;
default_type application/octet-stream;
send_file on;
tcp_nopush on;
keepalive_timeout 60;
log_format main '$remote_addr - $remote_user $time_local "$request" ' '$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forward_for"';
server {
listen 80;
server_name www.example.com;
access_log /var/log/nginx/www.example.com_access.log main;
error_log /var/log/nginx/www.example.com_error.log;
root /var/www/html;
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location /images/ {
root /var/www/images;
}
}
}
locationディレクティブ
table:locationディレクティブ
構文 location [ = | ~ | ~* | ^~ ] URI { ... } or location @名前つきロケーション名 { ... }
デフォルト値 なし
コンテキスト server, location
解説 マッチするURLIごとに設定を指定する
デフォルトでは前方一致でマッチングする。それ以外の場合は修飾子を指定する。
table:使用可能な修飾子
= 完全一致
~ 正規表現(大文字小文字を区別)
~* 正規表現(大文字小文字を区別しない)
なし 前方一致
^~ 前方一致(前方から評価し、一致したら以降の正規表現を評価しない)
前方一致のディレクティブを複数書いた場合、文字数が長い記述が優先される。
デフォルトと正規表現での前方一致では、正規表現での前方一致のほうが優先される。
indexページの指定
table:indexディレクティブ
構文 index ファイル名 ...;
デフォルト値 index.html
コンテキスト http, server, location
解説 インデックスページを指定する
ディレクトリにアクセスされた場合に表示するページをインデックスページと呼ぶ。
前から順に参照される。
autoindexディレクティブをしようすることでインデックスページを自動生成でき、これを有効にすることでディレクトリ内のファイルリストを自動的に生成する。
table:autoindexディレクティブ
構文 autoindex on | off
デフォルト値 off
コンテキスト http, server, location
解説 インデックスページの自動作成を有効・無効にする
外部に公開するとディレクトリ内の全てのファイルを参照できるようになってしまう。
エラーページの指定
table:error_pageディレクティブ
構文 error_page ステータスコード ... [ = 応答するステータスコード ] エラーページのURI;
デフォルト値 なし
コンテキスト http, server, location, location中のif
解説 エラー時に表示するページを指定する
エラーページの指定はHTTPステータスこおどごとに行う。
アクセス制限の設定
接続先IPアドレスによる制限
IPアドレスによるアクセス制限はngx_http_access_moduleで定義されているallow、denyディレクティブをしようすることで比較的簡単に設定できる。
table:allowディレクティブ
構文 allow 許可するアドレス | 許可するCIDR | unix: | all;
デフォルト値 なし
コンテキスト http, server, location, limit_except
解説 アクセスを許可するネットワークやアドレスを指定する
table:denyディレクティブ
構文 deny 拒否するアドレス | 拒否するCIDR | unix: | all;
デフォルト値 なし
コンテキスト http, server, location, limit_except
解説 アクセスを拒否するネットワークやアドレスを指定する
アドレスの指定にはIPアドレス or CIDER(Classless Inter-Domain Routing)ブロックがしようできる。
unix:はUNIXドメインソケットを全て使用、または拒否する。
Basic認証による制限
ngx_http_auth_basic_moduleをしようしてBasic認証を利用できる。
table:auth_basicディレクティブ
構文 auth_basic 認証領域名 | off;
デフォルト値 off
コンテキスト http, server, location, limit_except
解説 Basic認証の認証領域名を指定し、Basic認証を有効/無効にする
table:auth_basic_user_fileディレクティブ
構文 auth_basic_user_file ファイルパス;
デフォルト値 なし
コンテキスト http, server, location, limit_except
解説 Basic認証のユーザ名とパスワードを記述したファイルを指定する
Apache HTTPサーバの.htpasswdファイルと互換性があるパスワードファイルのフォーマットを示す。
username:password # ユーザ名:暗号化したパスワード
username:password:comment # ユーザ名:暗号化したパスワード:コメント
パスワードはcrypt()で暗号化され、openssl passwdコマンドにより実行できる。
$ openssl paswd パスワード
またApacheに付属しているhtpasswdコマンドをしようすることでもパスワードファイルを生成できる
$ htpasswd -c ファイルパス username
New password: <パスワード>
Re-type new password: <もう一度パスワードを入力>
Adding password for username
大量リクエストの制限
リクエストの制限方法は2種類ある
同時コネクション数の制限
時間あたりのリクエスト数の制限
同時コネクション数の制限
ngx_http_limit_conn_moduleで指定したキーごとに同時コネクション数を制限できる。
table:limt_conn_zoneディレクティブ
構文 limit_conn_zone キー名 zone=ゾーン名:サイズ;
デフォルト値 なし
コンテキスト http
解説 同時コネクション数をカウントするためのゾーンを作成する
table:limit_connディレクティブ
構文 limit_conn ゾーン名 最大コネクション数;
デフォルト値 なし
コンテキスト http
解説 同時コネクション数を制限する
時間あたりのリクエスト数
ngx_http_limit_req_moduleで大きなファイルへの時間あたりのリクエスト数を制限して、一部のリクエストが帯域を使い切らないようにするためにしようできる。
table:limit_req_zoneディレクティブ
構文 limit_req_zone キー名 zone=ゾーン名:サイズ rate=レートr/s;
デフォルト値 なし
コンテキスト http
解説 リクエスト数のレートを記録するためのゾーンを作成する
table:limit_reqディレクティブ
構文 limit_req zone=ゾーン名 [burst=バースト値] [nodelay];
デフォルト値 なし
コンテキスト http, server, location
解説 時間あたりのリクエスト数を制限する
最大レートは秒間リクエスト(r/s)で指定する。
burstパラメータを指定すると、burstパラメータに指定した数のリクエストをキューイングして遅延させて最大レートに遅まるように処理する。
nginxでは対応できないDoS攻撃
TCPの脆弱性を利用した攻撃(ex: SYN flood攻撃)
ボットネットなど多数のコンピュータを用いて大量のバケットを送信することにより回線帯域を埋め尽くすDDos攻撃
リクエストの書き換え
リクエストの書き換えは例として以下のような場合がある
特定ディレクトリ以下へのアクセスは全てエラーレスポンスを返したい
リクエストされるURIとファイルパスを別のものにしたい
リニューアルの際にページ名を変更したいので、古いURIにアクセスされた場合新しいページ名にリダイレクトしたい
特定のステータスコード
table:returnディレクティブ
構文 return ステータスコード 文字列;
return [ステータスコード] URI;
デフォルト値 なし
コンテキスト server, location, if
解説 特定のステータスコードを応答する
リクエストURIの書き換え
table:rewriteディレクティブ
構文 rewrite 正規表現 置換後の文字列 フラグ;
デフォルト値 なし
コンテキスト server, location, if
解説 リクエストURIを書き換える
rewriteディレクティブは正規表現にマッチしたリクエストURIを別の文字列に置換する。
フラグには以降のlocationコンテキストのマッチングが行われなくなる。
gzip転送
レスポンスボディを圧縮することで転送量を削減してデータ転送量を大幅に短縮できる。
リクエストのたびに動的に圧縮する方法とあらかじめ圧縮ファイルを用意しておきリクエスト時にそのファイルを送信する方法がある。
動的なgzip圧縮転送
gzipディレクティブをリクエストのたびに行う場合にはgzipディレクティブを指定する
table:gzipディレクティブ
構文 gzip on | off;
デフォルト値 off
コンテキスト http, server, location, location中のif
解説 gzip圧縮を有効・無効にする
gzip_typesディレクティブは圧縮対象となるファイルの最小サイズを指定する。
table:gzip_typeディレクティブ
構文 gzip_types 圧縮するMIMEタイプ ...;
デフォルト値 text/html
コンテキスト http, server, location
解説 gzip圧縮対象のMIMEタイプを指定する
gzip_min_lengthディレクティブでは圧縮対象となるファイルの最小サイズを指定する。
table:gzip_min_lengthディレクティブ
構文 gzip_min_length 圧縮する最小ボディサイズ;
デフォルト値 20
コンテキスト http, server, location
解説 gzip圧縮対象となるファイルの最小サイズを指定する
gzip_disableディレクティブではgzip圧縮を無効にするユーザーエージェントを指定する。
table:gzip_disableディレクティブ
構文 gzip_diable 正規表現 ...;
デフォルト値 なし
コンテキスト http, server, location
解説 gzip圧縮を無効にするユーザエージェントのパターンを指定する
あらかじめ用意した圧縮ファイルを転送
あらかじめ用意した圧縮ファイルを用意しておき、ファイルがリクエストされた時gzip未対応のリクエストであれば未圧縮のファイルを、gzipに対応したリクエストであればgzipファイルを転送する。
リクエストのたびにファイルの圧縮処理を行うとCPU使用率の増加とレスポンスの遅延が発生する。